// 使用 rbac 实现 Guard 守卫控制权限

import {
  CanActivate,
  ExecutionContext,
  ForbiddenException,
  Injectable,
} from '@nestjs/common';

// 方便后期维护，可存放在数据库中
export const roles = {
  root: 0, // 超级管理员
  admin: 1, // 管理员
  dev: 2, // 开发者
  test: 3, // （测试、运营具有同一权限，若提升为 RBAC 1 以上，则可酌情分开）
  author: 4, // 作者
  guest: 5, // 普通用户
  visitor: 6,
};

// RbacGuard 要在 AuthGuard 的上面，不然获取不到用户信息

@Injectable()
export class RbacGuard implements CanActivate {
  constructor(private readonly role: number) {}

  canActivate(context: ExecutionContext): boolean | Promise<boolean> {
    const request = context.switchToHttp().getRequest();
    const user = request.user;
    console.log(1111, user);
    if (roles[user.role] > this.role) {
      throw new ForbiddenException('对不起，您暂无权限');
    }
    return true;
  }
}
